// prova2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#define LEN 20
using namespace std;
typedef struct {
	char nome[LEN + 1];
	char cognome[LEN + 1];
	int età;
}DATI;
typedef struct NODO {
	DATI info;
	struct NODO*next;
}NODO;
bool lista_vuota(NODO*n);
NODO*alloca_();
void leggi(NODO*n);
NODO*inserimento(NODO*n);
void stampa(NODO*nt);
void menù();
void dealloca(NODO*n);
void ricerca(NODO*n);
NODO*cancella(NODO*n);

int main()
{
	menù();
	system("pause");
    return 0;
}

bool lista_vuota(NODO*n) {
	if (n == NULL) {
		return true;
	}
	else {
		return false;
	}
}
NODO*alloca_() {
	NODO*nuovo;
	nuovo = (NODO*)malloc(sizeof(NODO));
	nuovo->next = NULL;
	if (nuovo == NULL) {
		printf("errore sapazio insufficente\n");
		return 0;
	}
	return nuovo;
}
void leggi(NODO*n) {
	printf("inseire il cognome \n");
	scanf_s("%s", &n->info.cognome, LEN + 1);
	printf("inseire il nome \n");
	scanf_s("%s", &n->info.nome, LEN + 1);
	printf("inseire l'età \n");
	scanf_s("%d", &n->info.età, sizeof(int));


}
NODO*inserimento(NODO*n) {
	NODO*p;
	NODO*nuovo;
	NODO*prec;
	p = n;
	prec = NULL;
	if (lista_vuota(n) == true) {
		nuovo = alloca_();
		leggi(nuovo);
  		return nuovo; 
	}
	printf("NUOVO ALUNNO\n");
	nuovo = alloca_();
	leggi(nuovo);
	while (p != NULL) {
		if (strncmp(nuovo->info.cognome, p->info.cognome, LEN + 1) == 0 || strncmp(nuovo->info.cognome, p->info.cognome, LEN + 1) == -1) {
			if (prec == NULL) {
				nuovo->next = p;
				return nuovo;
			}
			else {
				prec->next = nuovo;
				nuovo->next = p;
				break;
			}
		}
		else {
			if (p->next == NULL) {
				p->next = nuovo;
				nuovo->next = NULL;
				break;
			}
			p = p->next;		prec = p;
		}

	}

}
void stampa(NODO*nt) {
	NODO*p = 0;
	int cont = 0;
	p = nt;
	while (p != NULL) {
		printf(" nodo %d il cognome è %s,\n il nome è %s\n,l' età è %d ", cont, p->info.cognome, p->info.nome, p->info.età);
		cont++;
		p = p->next;
	}
}
void dealloca(NODO*n) {
	NODO*p;
	if (lista_vuota(n) == true) {
		return;
	}
	else {

		while (n != NULL) {
			p = n;
			n = p->next;
			free(p);
			p = NULL;

		}
	}
}
void ricerca(NODO*n) {
	NODO*p;
	bool trovato = false;
	char cognome[LEN + 1];
	p = n;
	printf("inseisci il cognome da ricercare\n");
	scanf_s("%s", cognome, LEN + 1);
	if (lista_vuota(n) == true) {
		printf("la lista è vuota\n");
		system("pause");
	}
	else {
		while (p != NULL) {
			if (strcmp(p->info.cognome, cognome) == 0) {
				trovato = true;
				break;
			}
			p = p->next;
		}
		if (trovato = true) {
			printf("il cognome è presente\n");
		}
		else {
			printf("il cognome non è presente\n");
		}
	}
}
NODO*cancella(NODO*n) {
	NODO*p = 0;
	NODO*prec = 0;
	char cognome[LEN + 1];
	bool trovato = false;
	if (lista_vuota(n) == true) {
		printf("la lista è vuota \n");
		system("pause");
		return 0;
	}
	else {
		printf("insire il cognome da ricercare\n");
		scanf_s("%s", cognome, LEN + 1);
		while (p != NULL) {
			if (strcmp(p->info.cognome, cognome) == 0) {
				trovato = true;
				if (prec == NULL) {
					if (p->next == NULL) {
						free(p);
						return NULL;
					}
					else {
						n = p->next;
						free(p);
						return p;
					}
				}
				else {
					if (p->next == NULL) {
						prec->next = NULL;
						free(p);
						break;
					}
					else {
						prec->next = p->next;
						free(p);
						break;
					}
				}
			}
			prec = p;
			p = p->next;
		}
		if (trovato == false) {
			printf("elemento non trovato\n");
		}

	}
	return n;
}
void menù() {
	NODO*n = NULL;
	int scelta = 0;
	do {
		system("cls");
		printf("0.esci\n");
		printf("1.inserimento ordinato\n");
		printf("2.cancellazione elemnto \n");
		printf("3.visualizza\n");
		printf("4.ricerca\n");
		scanf_s("%d", &scelta, sizeof(int));
		switch (scelta) {
		case 0:
			printf("arivederci e lasciate la mancia\n");
			break;
		case 1:
			n = inserimento(n);

			break;
		case 2:
			n = cancella(n);
			break;
		case 3:
			stampa(n);
			system("pause");
			break;
		case 4:
			ricerca(n);
			system("pause");
			break;
		default:
			printf("valore non vaido \n");
			system("pause");
			break;
		}
	} while (scelta != 0);
	dealloca(n);
}